AWS Elemental MediaPackage v2でタイムシフト再生をしてみた
はじめに
清水です。昨年2023年5月にリリースされたAWS Elemental MediaPackage v2でタイムシフト再生(Time-shift viewing)をやってみました。Time-shift viewingについてはMediaPackage v1のころからサポートされていた機能で、MediaPackage v2でもリリースの際にはでにサポートされていたかと記憶しています。とはいえ、筆者はv2版のTime-shift viewingを設定したことがなかったため、改めて手順などまとめ、動作を確認してみたしだいです。
AWS Elemental MediaPackage v2 User Guideの以下のページを参照しながら進めていきます。
またMediaPackage v1で検証した以下エントリなども参照しながら進めました。6年前のエントリとなりますが、どのような違いがあるでしょうか!?
なお上記エントリでは、最終的な動画視聴をCloudFront経由で行っており、そのためのCloudFront設定についても触れています。ただ今回のエントリではあくまでMediaPackage v2のTime-shift viewingの設定や動作を確認したかったため、CloudFrontの設定については省略、MediaPackage v2 Origin endpointから直接、動画の視聴を行っています。
MediaPackage v2でTime-shift viewingをするためのリソース作成
まずはMediaPackage v2と、MediaLiveのリソースをそれぞれ作成していきます。
MediaPackage v2リソースの作成
MediaPackage v2リソースのChannelの作成からはじめます。Channel groupについては以下エントリなどを参照に作成したものを使用します。
Channel group詳細画面の[Create channel]ボタンから進みます。NameとDescriptionを適切に入力します。Input typeはCMAF
を選択しました。Channel policyはDon't attach a policy
でChannelを[Create]します。
Channelが作成できました。続いて[Create endpoint]ボタンからOrigin endpointを作成します。
NameとDescriptionを適切に入力、Container typeはCMAF
としました。Additional settingsの項目を展開し、Startover window (sec.)を確認しましょう。このStartover windowで指定した時間分だけ、過去にさかのぼってのタイムシフト再生が可能です。デフォルトでは900
(900秒=15分)となっていましたが、今回は3600
(3,600秒=60分)と設定しました。
Segment settingsとEncryptionはデフォルト設定のまま進めます。Endpoint policyはAttach a public policy
を今回は選択しました。用途に合わせた適切なPolicyを選択しましょう。
Manifest definitionsではHLS manifestを追加、Manifest nameならびにChild manifest nameを適切に設定します。そのほかの項目はデフォルトでOrigin endpointを[Create]します。
Origin Endpointが作成できました。
MediaLiveリソースの作成
続いてはMediaLiveリソースを作成します。InputについてはRTMP (push)
Input type、SINGLE_INPUT
Input classで作成しておきます。
MediaLive Channelについては、以下ブログエントリで作成したChannelをベースにします。
具体的には以下のChannel templateを使用します。
medialive-cmaf-ingest-channel-template.json
GitHub Gistのページからファイルをローカルにダウンロード、Create channelのChannel template、[Select cutom template]ボタンからファイルを読み込みます。
テンプレートを読み込んだあと、Chanel nameやIAM role、Channel classなどの設定を行います。またInput attachmentsでは先ほど作成したInputをAttachします。
Output groups内、各Outputについての設定はテンプレート内で定義されています。出力先、CMAF Ingest destinationだけ設定しておきましょう。MediaPackageのマネジメントコンソール、さきほど作成したMediaPackage ChannelのSettignsの項目を確認します。Ingest endpoint 1のURLメモしておきましょう。
MediaPackage ChannelのIngest endpoint 1のURLをMediaLive側、CMAF Ingest destination AのURL欄に入力します。Credentialsについてはそのまま(指定なし)でかまいません。
MediaLive Channelの設定、最後にTimecodeについての設定を行います。これは、MediaPackage v1でタイムシフト再生をしたときには意識していなかったのですが、以下を確認するとMediaLiveでSYSTEMCLOCK
のTimecodeを設定しておいたほうがよさそう、と認識しています。特に今回は映像の打ち上げにOBS Studioを使用するため、MediaLiveへの入力となる映像自体にTimecodeを埋め込むことができません。
General settingsの項目からTimecode Configurationを確認します。SourceがEMBEDDED
になっていますので、これをSYSTEMCLOCK
に変更します。
以上でMediaLive Channelの設定が完了です。[Create channel]してChannelを作成しましょう。
ライブストリームの開始とタイムシフトなしの視聴確認
MediaPackage v2とMediaLive、それぞれのリソースが作成できたらライブストリームを開始して、まずはタイムシフトなしの映像視聴を確認しましょう。
MediaLiveをStartさせます。
今回、Streaming SoftwareにはOBS Studioを利用しました。RTMPでMediaLiveに映像を打ち上げます。
MediaLiveをStartさせ、OBS Studioで[配信開始]ボタンを押下します。
MediaLiveのマネジメントコンソール、Channel詳細画面のPreviewで問題ないことをまずは確認します。
続いて、MediaPackageのOrigin endpoint詳細ページ、Manifest settingsの項目を確認します。[Preview]ボタンを押下しましょう。
hls.js demoページが、Playback URLを読み込んだかたちで開きます。タイムシフト再生のない、シンプルなライブストリームが再生できていることが確認できますね。
ここで、このシンプルなライブストリームのHLS ManifestファイルならびにChild manifestファイルについて確認してみましょう。curl
コマンドでPlayback URLにアクセスしてみます。まずはManifestファイルです。2つのChild manifestファイルが含まれていることが確認できますね。
% curl https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:LANGUAGE="und",AUTOSELECT=YES,CHANNELS="2",TYPE=AUDIO,URI="variant_audio_aac.m3u8",GROUP-ID="audio_0",DEFAULT=NO,NAME="und"
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.640028",AVERAGE-BANDWIDTH=5000000,RESOLUTION=1920x1080,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=5000000,AUDIO="audio_0"
variant_video_1080p30.m3u8
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.64001F",AVERAGE-BANDWIDTH=3000000,RESOLUTION=1280x720,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=3000000,AUDIO="audio_0"
variant_video_720p30.m3u8
続いてvariant_video_1080p30.m3u8
のほうのChild manifestファイルについて確認してみます。segment_video_1080p30_288104919.mp4
からsegment_video_1080p30_288104928.mp4
まで、10個のSegmentファイルが含まれていました。6秒x10で合計60秒、これはMediaPackage Origin endpointのManifest windowの値と一致する認識です。
% curl https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/variant_video_1080p30.m3u8
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:288104919
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXT-X-MAP:URI="segment_video_1080p30_288104887_init.mp4"
#EXTINF:6.006,
segment_video_1080p30_288104919.mp4
#EXTINF:6.006,
segment_video_1080p30_288104920.mp4
#EXTINF:6.006,
segment_video_1080p30_288104921.mp4
#EXTINF:6.006,
segment_video_1080p30_288104922.mp4
#EXTINF:6.006,
segment_video_1080p30_288104923.mp4
#EXTINF:6.006,
segment_video_1080p30_288104924.mp4
#EXTINF:6.006,
segment_video_1080p30_288104925.mp4
#EXTINF:6.006,
segment_video_1080p30_288104926.mp4
#EXTINF:6.006,
segment_video_1080p30_288104927.mp4
#EXTINF:6.006,
segment_video_1080p30_288104928.mp4
タイムシフト再生をManifestファイルで確認
さて、タイムシフト機能を使わない、通常のライブストリームの視聴ならびにManifestファイルが確認できました。続いて本題のタイムシフト再生の確認に移ります。まずはManifestファイルから確認していきます。
startとendパラメータを指定してタイムシフト再生
MediaPackage v2でのタイムシフト再生、基本的な使い方はMediaPackage v1のタイムシフト再生と同じでPlayback URLの末尾にクエリ文字列を付与するかたちです。
start
とend
、2つのクエリ文字列でそれぞれ開始時間と終了時間をを指定します。値はISO 8601またはPOSIX形式での指定となります。以下のようになりますね。
?start=2024-10-31T08:00:00Z&end=2024-10-31T08:30:00Z
- 開始時間2024/10/31 17:00:00 (JST)。終了時間2024/10/31 17:30 (JST)
- 実際はUTC時間(JSTで17:00:00ならUTCは08:00:00)で指定
- 開始時間2024/10/31 17:00:00 (JST)。終了時間2024/10/31 17:30 (JST)
?start=1730360700&end=1730361300
- 開始時間2024/10/31 16:45:00 (JST)。終了時間2024/10/31 16:55:00 (JST)
以下、ISO 8601形式のUTC時間で指定して確認していきます。いずれも検証している時間から60分(Startover windowで指定した時間)以内の時間を指定しています。
まずはManifestファイルです。Playback URLにクエリ文字列?start=2024-10-31T08:30:00Z&end=2024-10-31T08:33:00Z
を付与してリクエストしてみます。クエリ文字列をつけないときと同じく、2つのChild manifestファイルが含まれていますが、それぞれの末尾に同じクエリ文字列が付与されていることがわかります。
% date -Iseconds
2024-10-31T17:39:12+09:00
% date -Iseconds -u
2024-10-31T08:39:15+00:00
% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:30:00Z&end=2024-10-31T08:33:00Z"
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:LANGUAGE="und",AUTOSELECT=YES,CHANNELS="2",TYPE=AUDIO,URI="variant_audio_aac.m3u8?start=2024-10-31T08:30:00Z&end=2024-10-31T08:33:00Z",GROUP-ID="audio_0",DEFAULT=NO,NAME="und"
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.640028",AVERAGE-BANDWIDTH=5000000,RESOLUTION=1920x1080,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=5000000,AUDIO="audio_0"
variant_video_1080p30.m3u8?start=2024-10-31T08:30:00Z&end=2024-10-31T08:33:00Z
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.64001F",AVERAGE-BANDWIDTH=3000000,RESOLUTION=1280x720,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=3000000,AUDIO="audio_0"
variant_video_720p30.m3u8?start=2024-10-31T08:30:00Z&end=2024-10-31T08:33:00Z
続いてVariant、variant_video_1080p30.m3u8?start=2024-10-31T08:30:00Z&end=2024-10-31T08:33:00Z
を取得してみます。segment_video_1080p30_288105795.mp4
からsegment_video_1080p30_288105824.mp4
まで、30個のSegmentファイルが含まれていました。6秒x30で合計180秒、startとendで指定した3分間と一致しますね。
% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/variant_video_1080p30.m3u8?start=2024-10-31T08:30:00Z&end=2024-10-31T08:33:00Z"
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:288105795
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXT-X-MAP:URI="segment_video_1080p30_288104887_init.mp4"
#EXTINF:6.006,
segment_video_1080p30_288105795.mp4
#EXTINF:6.006,
segment_video_1080p30_288105796.mp4
#EXTINF:6.006,
segment_video_1080p30_288105797.mp4
#EXTINF:6.006,
segment_video_1080p30_288105798.mp4
#EXTINF:6.006,
segment_video_1080p30_288105799.mp4
#EXTINF:6.006,
segment_video_1080p30_288105800.mp4
#EXTINF:6.006,
segment_video_1080p30_288105801.mp4
#EXTINF:6.006,
segment_video_1080p30_288105802.mp4
#EXTINF:6.006,
segment_video_1080p30_288105803.mp4
#EXTINF:6.006,
segment_video_1080p30_288105804.mp4
#EXTINF:6.006,
segment_video_1080p30_288105805.mp4
#EXTINF:6.006,
segment_video_1080p30_288105806.mp4
#EXTINF:6.006,
segment_video_1080p30_288105807.mp4
#EXTINF:6.006,
segment_video_1080p30_288105808.mp4
#EXTINF:6.006,
segment_video_1080p30_288105809.mp4
#EXTINF:6.006,
segment_video_1080p30_288105810.mp4
#EXTINF:6.006,
segment_video_1080p30_288105811.mp4
#EXTINF:6.006,
segment_video_1080p30_288105812.mp4
#EXTINF:6.006,
segment_video_1080p30_288105813.mp4
#EXTINF:6.006,
segment_video_1080p30_288105814.mp4
#EXTINF:6.006,
segment_video_1080p30_288105815.mp4
#EXTINF:6.006,
segment_video_1080p30_288105816.mp4
#EXTINF:6.006,
segment_video_1080p30_288105817.mp4
#EXTINF:6.006,
segment_video_1080p30_288105818.mp4
#EXTINF:6.006,
segment_video_1080p30_288105819.mp4
#EXTINF:6.006,
segment_video_1080p30_288105820.mp4
#EXTINF:6.006,
segment_video_1080p30_288105821.mp4
#EXTINF:6.006,
segment_video_1080p30_288105822.mp4
#EXTINF:6.006,
segment_video_1080p30_288105823.mp4
#EXTINF:6.006,
segment_video_1080p30_288105824.mp4
#EXT-X-ENDLIST
startパラメータのみを指定したタイムシフト再生
タイムシフト再生の際、クエリ文字列のend parameterは省略することが可能です。Playback URLに?start=2024-10-31T08:42:00Z
というクエリ文字列のみを付与してリクエストしてみます。Manifestファイル内、Child manifestファイルの末尾のクエリ文字列もstart
のみになっていますね。
% date -Iseconds
2024-10-31T17:44:01+09:00
% date -Iseconds -u
2024-10-31T08:44:04+00:00
% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:42:00Z"
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:LANGUAGE="und",AUTOSELECT=YES,CHANNELS="2",TYPE=AUDIO,URI="variant_audio_aac.m3u8?start=2024-10-31T08:42:00Z",GROUP-ID="audio_0",DEFAULT=NO,NAME="und"
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.640028",AVERAGE-BANDWIDTH=5000000,RESOLUTION=1920x1080,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=5000000,AUDIO="audio_0"
variant_video_1080p30.m3u8?start=2024-10-31T08:42:00Z
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.64001F",AVERAGE-BANDWIDTH=3000000,RESOLUTION=1280x720,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=3000000,AUDIO="audio_0"
variant_video_720p30.m3u8?start=2024-10-31T08:42:00Z
Variantファイル、variant_video_1080p30.m3u8?start=2024-10-31T08:42:00Z
についてもアクセスしてみます。Segmentファイルは21個、これだけではわかりにくいのですが、startで指定した時間から最新のSegmentファイルまでが列挙されています。
% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/variant_video_1080p30.m3u8?start=2024-10-31T08:42:00Z"
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:288105915
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXT-X-MAP:URI="segment_video_1080p30_288104887_init.mp4"
#EXTINF:6.006,
segment_video_1080p30_288105915.mp4
#EXTINF:6.006,
segment_video_1080p30_288105916.mp4
#EXTINF:6.006,
segment_video_1080p30_288105917.mp4
#EXTINF:6.006,
segment_video_1080p30_288105918.mp4
#EXTINF:6.006,
segment_video_1080p30_288105919.mp4
#EXTINF:6.006,
segment_video_1080p30_288105920.mp4
#EXTINF:6.006,
segment_video_1080p30_288105921.mp4
#EXTINF:6.006,
segment_video_1080p30_288105922.mp4
#EXTINF:6.006,
segment_video_1080p30_288105923.mp4
#EXTINF:6.006,
segment_video_1080p30_288105924.mp4
#EXTINF:6.006,
segment_video_1080p30_288105925.mp4
#EXTINF:6.006,
segment_video_1080p30_288105926.mp4
#EXTINF:6.006,
segment_video_1080p30_288105927.mp4
#EXTINF:6.006,
segment_video_1080p30_288105928.mp4
#EXTINF:6.006,
segment_video_1080p30_288105929.mp4
#EXTINF:6.006,
segment_video_1080p30_288105930.mp4
#EXTINF:6.006,
segment_video_1080p30_288105931.mp4
#EXTINF:6.006,
segment_video_1080p30_288105932.mp4
#EXTINF:6.006,
segment_video_1080p30_288105933.mp4
#EXTINF:6.006,
segment_video_1080p30_288105934.mp4
#EXTINF:6.006,
segment_video_1080p30_288105935.mp4
クエリ文字列の指定方法について
検証している際、クエリ文字列として指定するstartとendについて、少し癖のようなものがあることが確認できました。MediaPackage v2の仕様なのか、MediaLiveでSYSTEMCLOCK
Timecodeを設定しているためか、詳細はわからないのですが、今回はこれらの事情でUTCで指定することとしました。
検証の際、まずはISO 8601形式で、最も馴染み深いJSTで指定しようと試みました。結果は以下のように、パラメータがおかしいという旨のメッセージが返ってきてしまいます。
% date -Iseconds
2024-10-31T17:48:09+09:00
% date -Iseconds -u
2024-10-31T08:48:10+00:00
% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T17:45:00+09:00"
{"Message":"MediaPackage can't process your request because you queried primary playlist path without including a valid start parameter. Retry your query request with a valid start parameter described in https://docs.aws.amazon.com/mediapackage/latest/userguide/time-shifted.html#start-and-end-parameters-rules."}
しかし、同じタイミングで時刻をUTCで指定するとManifestファイルが返ってきました。
% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:45:00Z"
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:LANGUAGE="und",AUTOSELECT=YES,CHANNELS="2",TYPE=AUDIO,URI="variant_audio_aac.m3u8?start=2024-10-31T08:45:00Z",GROUP-ID="audio_0",DEFAULT=NO,NAME="und"
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.640028",AVERAGE-BANDWIDTH=5000000,RESOLUTION=1920x1080,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=5000000,AUDIO="audio_0"
variant_video_1080p30.m3u8?start=2024-10-31T08:45:00Z
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.64001F",AVERAGE-BANDWIDTH=3000000,RESOLUTION=1280x720,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=3000000,AUDIO="audio_0"
variant_video_720p30.m3u8?start=2024-10-31T08:45:00Z
またUser Guideにならい、-08:00
のタイムゾーンを指定してみました。これは問題なくManifestファイルが返ってきます。(-08:00
がよくて+09:00
がダメなのがちょっと不思議な感じがしますが……。深追いしても仕方ないかなと、JST +09:00
の利用は断念しました。)
% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T00:45:00-08:00"
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:LANGUAGE="und",AUTOSELECT=YES,CHANNELS="2",TYPE=AUDIO,URI="variant_audio_aac.m3u8?start=2024-10-31T00:45:00-08:00",GROUP-ID="audio_0",DEFAULT=NO,NAME="und"
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.640028",AVERAGE-BANDWIDTH=5000000,RESOLUTION=1920x1080,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=5000000,AUDIO="audio_0"
variant_video_1080p30.m3u8?start=2024-10-31T00:45:00-08:00
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.64001F",AVERAGE-BANDWIDTH=3000000,RESOLUTION=1280x720,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=3000000,AUDIO="audio_0"
variant_video_720p30.m3u8?start=2024-10-31T00:45:00-08:00
なおUTCで指定する場合でも、+00:00
ではダメでZ
と指定する必要がありました。(macOSでdate -Iseconds -u
で取得できるのが+00:00
だったので、これが使えるとよかったのですが。)
% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:45:00+00:00"
{"Message":"MediaPackage can't process your request because you queried primary playlist path without including a valid start parameter. Retry your query request with a valid start parameter described in https://docs.aws.amazon.com/mediapackage/latest/userguide/time-shifted.html#start-and-end-parameters-rules."}
% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:45:00Z"
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:LANGUAGE="und",AUTOSELECT=YES,CHANNELS="2",TYPE=AUDIO,URI="variant_audio_aac.m3u8?start=2024-10-31T08:45:00Z",GROUP-ID="audio_0",DEFAULT=NO,NAME="und"
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.640028",AVERAGE-BANDWIDTH=5000000,RESOLUTION=1920x1080,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=5000000,AUDIO="audio_0"
variant_video_1080p30.m3u8?start=2024-10-31T08:45:00Z
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.64001F",AVERAGE-BANDWIDTH=3000000,RESOLUTION=1280x720,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=3000000,AUDIO="audio_0"
variant_video_720p30.m3u8?start=2024-10-31T08:45:00Z
タイムシフト再生を実際の映像を視聴して確認
タイムシフト再生について、まずはManifestファイルでの確認ができました。通常のライブストリームと異なり、Child manifestファイルに多くのSegmentが列挙されていましたね。続いて、タイムシフト再生を実際の映像で視聴して確認していましょう。
hls.js demoページを使った視聴確認
まずはMediaPackageのマネジメントコンソールから確認できるhls.js demoのページを再生環境として使用します。
Playback URLにクエリ文字列を付与した以下を指定し、[Apply]ボタンを押下します。
https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:30:00Z&end=2024-10-31T08:45:00Z
再生がはじまりました!パラメータで指定したstartとendが反映され、15分間のコンテンツとして扱われています。
続いて、endパラメータをなくしてstartパラメータのみで確認してみましょう。以下URLを入力して[Apply]ボタンを押下します。
https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:50:00Z
最新のライブストリームが再生されますが、シークバー部分を確認してみましょう。startパラメータで指定した時間まで戻ることができます。
最新のライブストリームが視聴できつつ、シークバーの操作でstartで指定した過去にも戻れる、というぐあいですね。ただ、いちどシークバーを操作して過去に戻った場合、最新のライブストリームに戻るのがちょっと大変そうです。(シークすればいいだけではありますが。)
Video.jsを使った視聴確認
この、タイムシフト再生で過去に戻ったあと、最新のライブストリームに簡単に戻る方法、以前MediaPackage v1でやったときはどうしていたっけ?と、以前のエントリを再度確認してみました。(6年前ということで、ちょっとうろ覚えになってしまっています……。)
「タイムシフト再生用にvideojs-dvrseekbarをVideo.jsプレイヤーに設定する」という章で扱っているのですが、Video.jsのプラグインの1つである「videojs-dvrseekbar」を利用していました。
ただ、当時参照していたdist/videojs-dvrseekbar.js
というファイルが現在はありません。以前は以下URLで参照できていたようなのですが、現在では404 - page not found
となってしまいます。
少し調べてみたところ、Video.js 7以降ではdvrseekbarプラグイン自体がVideo.jsに取り込まれたようです。
そのため、別途プラグインを読み込まずとも、Video.jsのライブラリさえ読み込めばDRV機能にも対応できるとのこと。上記URL記載の情報を参考に(真似して)、以下のような視聴ページを作成しました。Video.jsのバージョンは確認できた最新版(8.16.1)を利用しています。
<html>
<head>
<title>MediaPackage v2 Time-shifted viewing</title>
<link href="https://vjs.zencdn.net/8.16.1/video-js.min.css" rel="stylesheet">
</head>
<body>
<video id="example-video" width="1280" height="720"
class="video-js vjs-default-skin" controls>
</video>
<script src="https://vjs.zencdn.net/8.16.1/video.min.js"></script>
<!--<script src="./videojs-contrib-hls.js"></script>-->
<script>
let hls = {
src: "https://example.com/path/to/manifest.m3u8",
type: "application/x-mpegURL" };
let options = {
liveui: true };
let readyPlayer = function () {
this.src(hls); };
let player = videojs("example-video", options, readyPlayer);
</script>
</body>
</html>
src: "https://example.com/path/to/manifest.m3u8",
の箇所をsrc: "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:50:00Z","
と、Playback URLにタイムシフト再生用のクエリ文字列を付けたものに置き換えます。
このHTMLファイルをApache HTTP Serverの稼働するAmazon EC2に配置し、HTTPでアクセスできるようにします。ブラウザでアクセスして再生ボタンを押すと、以下のようにライブストリームの再生がはじまりました。右下にLIVE
のマークがありますね。
過去にシークすると、LIVE
マークの赤い印が消えます(グレーになります)。
ライブストリームに戻りたい場合はLIVE
マークをクリックしてみましょう。LIVE
マークに赤い印がつき、ライブストリームに戻ります!
まとめ
MediaPackage v2でタイムシフト再生(Time-shift viewing)をやってみました。基本的にな使い方はMediaPackage v1と同じで、あらかじめタイムシフト再生したい時間分のStartover Windowを指定しておきます。(マネジメントコンソールでOrigin endpointを作成した場合、デフォルトで900秒が設定されています。ただ15分以上のタイムシフト再生をしたい場合はこの数値を変更する必要があるので注意しましょう。)再生する際、ManifestファイルのURLにstart
、end
のクエリ文字列を付与してリクエストを行います。start
のみ指定してライブストリームから過去にさかのぼることができる視聴体験も簡単に実現できますが、その際はライブストリームに戻りやすいようなUIがある動画プレイヤーを使うとよさそうですね。
なお、今回CloudFrontの設定について省略しましたが、実際に設定する際にはクエリ文字列をオリジンに転送する設定を忘れないようにしましょう。